﻿///////////////////////////////////////////////////////////////////////////
// 文件名:     heartbeatmanage.h
// 描述:
// 作者:      颜磊
// 创建时间:   2024-06-08 23:42
///////////////////////////////////////////////////////////////////////////
#ifndef HEARTBEATMANAGE_H
#define HEARTBEATMANAGE_H

#include "string"
#include "time.h"
#include <map>
#include <thread>
#include <windows.h>

#pragma comment(lib, "Advapi32.lib")

using namespace std;

#pragma pack(push, 1)
struct HeartbeatMsg
{
    long long timestamp;
    bool exitFlag; //主动退出标识
    HeartbeatMsg()
    {
        memset(this, 0, sizeof(HeartbeatMsg));
    }
};
#pragma pack(pop)

class SharedMemory
{
public:
    SharedMemory();
    ~SharedMemory();
    HANDLE openSharedMemory(string name, int size);
    bool setSharedMemoryData(string name, char *data, int size);
    bool getSharedMemoryData(string name, char *data, int size);
    void closeSharedMemory(HANDLE hMapFile);
};

class HeartbeatManage
{
public:
    HeartbeatManage();
    ~HeartbeatManage();
    //===================守护服务使用的函数
    /**
     * @brief checkHeartbeat
     * @param name
     * @return 0:校验失败 1:校验成功 2：主动退出
     */
    int checkHeartbeat(string name, int timeoutSec = 10); //校验心跳

    //===================用户进程使用函数
    void start();                                              //启动心跳线程;
    void stop();                                               //停止心跳线程;
    void beat();                                               //外部自定义线程进行心跳
    void exit();                                               //主动退出，告诉守护无需启动   ！！！主动退出调用！！！
    void setHeartbeatHeader(const string &newHeartbeatHeader); //设置心跳标识

private:
    bool isRun;
    void beatRun();

private:
    string heartbeatHeader;
    SharedMemory sharedMemory;
    map<string, HANDLE> heartbeatMap;
    thread beatThread;
};

#endif // HEARTBEATMANAGE_H
